//
// Created by 余代宸 -Yu DaiChen on 2021/12/18
// QQ-E-MAIL:250074249@qq.com
//
#pragma warning(disable: 4996)
#pragma once
#ifndef MINI_REDIS_SIMPLE_UTILS_H
#define MINI_REDIS_SIMPLE_UTILS_H
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <malloc.h>

#ifdef WIN32
#include <windows.h>
#elif __linux__

#include <unistd.h>        // linux下头文件
#include <bits/pthreadtypes.h>
#include <pthread.h>

#else
#include <unistd.h>        // linux下头文件
#include <pthread.h>

#endif

#define FILE_MAX_SIZE (1024*1024) //日志文件最大SIZE
#define LOG_FILE_PATH "log.txt" //日志文件路径

/**
 * @brief 考虑在编译器认为64bit指针转换至32bit整数是丢失精度的，所以不使用（int）arg强制转换
 * @param val [in]: 需要转换的void * 类型的value
 * @return int类型的arg
 */
int voidPointToInt(void *val);

enum LogLevel {
	LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG
};

/**
 * @brief 信息日志工具
 * @param str [in]: 待存入日志文件的字符串
 * @param level [in]: enum logLevel
 * 	ERROR 指出虽然发生错误事件，但仍然不影响系统的继续运行。打印错误和异常信息，如果不想输出太多的日志，可以使用这个级别
 *	WARN 表明会出现潜在错误的情形，有些信息不是错误信息，但是也要给程序员的一些提示
 *	INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息，这个可以用于生产环境中输出程序运行的一些重要信息，但是不能滥用，避免打印过多的日志。
 *	DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的，主要用于开发过程中打印一些运行信息。
 */
void logUtils(const char *str, enum LogLevel level);

/**
*@brief 获得当前时间字符串
*@param val [out]: 时间字符串
*/
void getLocalTime(char *val);

/**
*@brief 获得文件大小
*@param filename [in]: 文件名
*@return 文件大小
*/
long getFileSize(const char *filename);

/**
*@brief 私有的写入日志文件工具
*@param val [in]: 日志内容
*@param valSize [in]: 日志内容大小
*/
void privateWriteLogFile(const char *val);

#endif //MINI_REDIS_SIMPLE_UTILS_H
